package com.cgnpc.scp.manager.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cgnpc.cud.core.domain.AjaxResult;
import com.cgnpc.scp.common.bean.MyPageResult;
import com.cgnpc.scp.common.pojo.UserInfo;
import com.cgnpc.scp.common.utils.MyPageResultUtil;
import com.cgnpc.scp.common.utils.SqlUtil;
import com.cgnpc.scp.common.utils.StringUtil;
import com.cgnpc.scp.manager.mybatis.entity.DataDict;
import com.cgnpc.scp.manager.mybatis.entity.ParameterConfig;
import com.cgnpc.scp.manager.mybatis.mapper.client.ParameterConfigMapper;
import com.cgnpc.scp.manager.service.IParameterConfigService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

@Service
public class ParameterConfigServiceImpl implements IParameterConfigService {
    private static final Logger LOGGER = LoggerFactory.getLogger(ParameterConfigServiceImpl.class);

    @Autowired
    private ParameterConfigMapper parameterConfigMapper;

    @Transactional(rollbackFor = Exception.class)
    @Override
    public <T extends ParameterConfig> AjaxResult saveOrUpdate(UserInfo loginUserInfo, Locale reqLocale, List<T> reqEntityList) {
        AjaxResult ajaxResult = null;

        try {
            Date nowDate = new Date();

            // begin 获取登录用户的信息
            String loginUserInfoUserId = loginUserInfo.getUserId();
            String loginUserInfoUserName = loginUserInfo.getUserName();
            // end 获取登录用户的信息

            ParameterConfig dbParameterConfig = null;
            String reqParamKey = null;
            String reqParamValue = null;
            String reqParamName = null;
            String reqIsSystemConfig = null;

            for (ParameterConfig reqEntity : reqEntityList) {
                reqParamKey = reqEntity.getParamKey();
                reqParamValue = reqEntity.getParamValue();
                reqParamName = reqEntity.getParamName();
                reqIsSystemConfig = reqEntity.getIsSystemConfig();

                dbParameterConfig = parameterConfigMapper.selectById(reqParamKey);

                if (dbParameterConfig == null) {
                    // 保存
                    ParameterConfig usedParameterConfig = new ParameterConfig();
                    usedParameterConfig.setParamKey(reqParamKey);
                    usedParameterConfig.setParamValue(reqParamValue);
                    usedParameterConfig.setParamName(reqParamName);
                    usedParameterConfig.setCreateTime(nowDate);
                    usedParameterConfig.setCreateUser(loginUserInfoUserId);
                    usedParameterConfig.setCreateUserName(loginUserInfoUserName);
                    usedParameterConfig.setLastUpdateTime(nowDate);
                    usedParameterConfig.setLastUpdateUser(loginUserInfoUserId);
                    usedParameterConfig.setLastUpdateUserName(loginUserInfoUserName);
                    usedParameterConfig.setIsSystemConfig(reqIsSystemConfig);

                    int saveRows = parameterConfigMapper.insert(usedParameterConfig);
                } else {
                    // 修改
                    ParameterConfig usedParameterConfig = new ParameterConfig();
                    usedParameterConfig.setParamKey(reqParamKey);
                    usedParameterConfig.setParamValue(reqParamValue);
                    usedParameterConfig.setParamName(reqParamName);
                    // usedParameterConfig.setCreateTime(nowDate);
                    // usedParameterConfig.setCreateUser(loginUserInfoUserId);
                    // usedParameterConfig.setCreateUserName(loginUserInfoUserName);
                    usedParameterConfig.setLastUpdateTime(nowDate);
                    usedParameterConfig.setLastUpdateUser(loginUserInfoUserId);
                    usedParameterConfig.setLastUpdateUserName(loginUserInfoUserName);
                    usedParameterConfig.setIsSystemConfig(reqIsSystemConfig);

                    int updateRows = parameterConfigMapper.updateById(usedParameterConfig);
                }
            }

            ajaxResult = AjaxResult.success("保存或修改成功");
        } catch (Exception e) {
            LOGGER.error("saveOrUpdate.error;", e);
            throw e;
        }

        return ajaxResult;
    }

    @Override
    public   MyPageResult<ParameterConfig> loadByPaging(ParameterConfig reqEntity) {
        // begin 分页开始
        // 第几页
        int pageNum = reqEntity.getPageNum();
        // 每页的数量
        int pageSize = reqEntity.getPageSize();
        // 创建Page对象，将pageNum，pageSize参数传入，必须位于数据库查询数据的语句之前，否则不生效
        com.baomidou.mybatisplus.extension.plugins.pagination.Page<ParameterConfig> page = new Page<>(pageNum, pageSize);
        // mybatis查询方式
//        DataDictExample queryExample = new DataDictExample();
//        DataDictExample.Criteria queryExampleCriteria = queryExample.createCriteria();

        QueryWrapper<ParameterConfig> queryWrapper = new QueryWrapper<>();

        // 设置排序字段
        // queryExample.setOrderByClause("order_index");

        // 参数名称
        if (!StringUtil.isNullOrSpace(reqEntity.getParamName())) {
            queryWrapper.like("param_Name",reqEntity.getParamName());
        }

        // 参数键名
        if (!StringUtil.isNullOrSpace(reqEntity.getParamKey())) {
            queryWrapper.like("param_Key",reqEntity.getParamKey());
        }

        // 执行查询
        IPage<ParameterConfig> processInfoIPage = parameterConfigMapper.selectPage(page, queryWrapper);
        // 执行查询
//        List<T> dbEntityList = (List<T>) dataDictMapper.selectByExample(queryExample);
        MyPageResult<ParameterConfig> myPageResult = MyPageResultUtil.createMyPageResultPlus(processInfoIPage);
        return myPageResult;
    }

    @Override
    public AjaxResult del(UserInfo loginUserInfo, Locale reqLocale, ParameterConfig reqParameterConfig) {
        final String logInfo = "[delParameterConfig_UUID_" + UUID.randomUUID() + "]";
        AjaxResult ajaxResult = null;

        try {
            // begin 获取登录用户的信息
            String loginUserInfoUserId = loginUserInfo.getUserId();
            String loginUserInfoUserName = loginUserInfo.getUserName();
            // end 获取登录用户的信息

            List<String> reqParamKeyList = reqParameterConfig.getParamKeyList();

            LOGGER.info("{}printInfo;loginUserInfoUserId:{};loginUserInfoUserName:{};"
                            + "reqParamKeyList:{};"
                    , logInfo
                    , loginUserInfoUserId, loginUserInfoUserName
                    , reqParamKeyList
            );

            int delRows = parameterConfigMapper.deleteBatchIds(reqParamKeyList);
            LOGGER.info("{}delRows:{};", logInfo, delRows);

            ajaxResult = AjaxResult.success("删除成功；共删除" + delRows + "条数据。");
        } catch (Exception e) {
            LOGGER.error("{}del.error;", logInfo, e);
            throw e;
        }

        return ajaxResult;
    }

    @Override
    public List<ParameterConfig> queryByParamKey(ParameterConfig reqParameterConfig) {
        String reqParamKey = reqParameterConfig.getParamKey();

        return Arrays.asList(parameterConfigMapper.selectById(reqParamKey)) ;
    }

}
